Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

DbSimple v2.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 10)
Goto page Previous  1, 2, 3 ... 6, 7, 8 ... 13, 14, 15  Next
Author Message
Gera
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Dec 18, 2007 11:26 am (написано за 1 минуту 28 секунд)
   Post subject: DbSimple или SimpleDB
Reply with quote

DbSimple или SimpleDB
Очень похожие названия, кто у кого?

highscalability.com/current-pros-and-cons-list-simpledb
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Fri Jan 04, 2008 12:07 pm (спустя 17 дней 40 минут; написано за 2 минуты 2 секунды)
   Post subject:
Reply with quote

В selectPage() нет смысла делать подзапрос, подсчитывающий количество найденных строк, когда найдено ноль строк.
Code (SQL): скопировать код в буфер обмена
/* отработал первый запрос из selectPage() */
  -- 1 ms; returned 0 row(s)
SELECT FOUND_ROWS()
  -- 0 ms; returned ('0')
 
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Jan 05, 2008 1:44 am (спустя 13 часов 36 минут; написано за 23 секунды)
   Post subject:
Reply with quote

Антон Макаренко
А как быть с ситуацией, когда просто LIMIT зашкалило?
Back to top
View user's profile Send private message
pav
Участник форума



Joined: 12 Mar 2003
Posts: 203
Карма: 4
   поощрить/наказать

Location: Россия / г.Северодвинск

PostPosted: Tue Jan 08, 2008 10:09 am (спустя 3 дня 8 часов 25 минут; написано за 9 секунд)
   Post subject:
Reply with quote

Столкнулся с неприятной ситуацией с целочисленным плейсхолдером. Если быть точнее то просто нарвался на превышение диапазона допустимых значений в нативном пхп'ном intval который используется для приведения к целому в _expandPlaceholdersCallback. Вожможно будет правильнее перед приведением сделать проверку на то что является ли входное значение числом, и если уж нет то только тогда использовать intval. Или хотябы в документации к DbSimple явно указать что есть intval и все в этом мире имеет свой придел :)
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Wed Jan 09, 2008 1:29 pm (спустя 1 день 3 часа 20 минут; написано за 2 минуты 11 секунд)
   Post subject:
Reply with quote

Maus wrote:
LIMIT зашкалило
А как это "зашкалило"?

В таком случае "зашкалит" и второй подзапрос в фаербёрде, так как там нет встроенной функции SELECT FOUND_ROWS()
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jan 10, 2008 3:48 am (спустя 14 часов 18 минут; написано за 18 секунд)
   Post subject:
Reply with quote

pav
Можете, пожалуйста, рассказать, как Вы работаете с числами, больше чем 2^31 в PHP??
Back to top
View user's profile Send private message Send e-mail
pav
Участник форума



Joined: 12 Mar 2003
Posts: 203
Карма: 4
   поощрить/наказать

Location: Россия / г.Северодвинск

PostPosted: Thu Jan 10, 2008 10:18 am (спустя 6 часов 29 минут; написано за 2 минуты 36 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов
В пхп я его просто вычисляю,
простейший пример:
Code (php): скопировать код в буфер обмена
$ip_num=16777216*$part_ip[1] + 65536*$part_ip[2] + 256*$part_ip[3] + $part_ip[4];
полученный результат вполне корректен,
а дальше используется только в запросах к БД.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jan 10, 2008 10:46 pm (спустя 12 часов 28 минут; написано за 3 секунды)
   Post subject:
Reply with quote

pav
ip2long?
Back to top
View user's profile Send private message Send e-mail
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Fri Jan 11, 2008 10:49 am (спустя 12 часов 3 минуты; написано за 2 минуты 29 секунд)
   Post subject:
Reply with quote

Сорри за оффтоп.
МОДЕРАТОРАМ: У меня не стоит "Следить за ответами в этой теме", но эта тема всё равно становится "красной" после ответа в неё
Как отписаться?

ЗЫ. После прочтения этого сообщения и ответа на него можете его удалить
Ещё раз сорри

Last edited by KES on Fri Jan 11, 2008 1:59 pm; edited 1 time in total
Back to top
View user's profile Send private message
pav
Участник форума



Joined: 12 Mar 2003
Posts: 203
Карма: 4
   поощрить/наказать

Location: Россия / г.Северодвинск

PostPosted: Fri Jan 11, 2008 12:58 pm (спустя 2 часа 8 минут; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов wrote:
ip2long
Это немного другое. Я вынужден применять именно такой алгоритм как описал выше. Вот по этой (www.maxmind.com/app/csv) причине.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Fri Jan 11, 2008 3:03 pm (спустя 2 часа 5 минут; написано за 1 минуту 19 секунд)
   Post subject:
Reply with quote

pav
В таком экзотическом случае я бы не погнушался вставить число без плейсхолдера. Или может стоит переопределить функцию в классе-наследнике (если такое возможно)?
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sat Jan 12, 2008 10:48 am (спустя 19 часов 44 минуты; написано за 27 секунд)
   Post subject:
Reply with quote

pav
Да, вероятно действительно лучше вставлять число просто без плейсхолдера, если Вы точно уверены, что вставляемое Вами значение всегда будет числом.
Back to top
View user's profile Send private message Send e-mail
pav
Участник форума



Joined: 12 Mar 2003
Posts: 203
Карма: 4
   поощрить/наказать

Location: Россия / г.Северодвинск

PostPosted: Sat Jan 12, 2008 10:55 am (спустя 7 минут; написано за 55 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов
Так и делаю. Просто по привычки ставил ?d и просто не ожидал что будут проблемы.
Back to top
View user's profile Send private message Send e-mail
RADiActive
Заглянувший



Joined: 23 Mar 2007
Posts: 9
Карма: -1
   поощрить/наказать


PostPosted: Tue Jan 22, 2008 7:53 am (спустя 9 дней 20 часов 57 минут; написано за 4 минуты 29 секунд)
   Post subject:
Reply with quote

Здравствуйте.
В связи с обновлением ПО на хостингах до MySQL версии 5, запросы с использованием "LEFT JOIN" не работают.
Имеет ли смысл в библиотеку для совместимости добавлять:
Code (php): скопировать код в буфер обмена
$sql = preg_replace (www.php.net/preg_replace)("/FROM([^\"\']+?)LEFT/is","FROM(($1)) LEFT", $sql);
Библиотека будет действительно Simple :)

P.S. Есть ли какие-то еще различия, которые нужно учесть? И стоит ли делать поддержку 5ой версии на базе уж существующей библиотеки?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Jan 22, 2008 8:59 am (спустя 1 час 6 минут; написано за 2 секунды)
   Post subject:
Reply with quote

A чем отличается синтаксис LEFT JOIN для mysql5?
Back to top
View user's profile Send private message Send e-mail
RADiActive
Заглянувший



Joined: 23 Mar 2007
Posts: 9
Карма: -1
   поощрить/наказать


PostPosted: Tue Jan 22, 2008 2:37 pm (спустя 5 часов 38 минут; написано за 1 минуту 22 секунды)
   Post subject:
Reply with quote

Упс! Удалите, пожалуйста, пост выше. Это был мой, я запросом ошибся :(

Для MySQL 4 (в 5ой будет ошибка):
Code (php): скопировать код в буфер обмена
    $products = $DB->selectPage(
        $total_products,
        'SELECT
            a.product_id,
            a.name,
            a.price,
            a.quantity,
            c.filename,
            c.thumbnail
        FROM
            '
. TABLE_PRODUCTS . ' a,
            '
. TABLE_PRODUCT__MODEL . ' b
        LEFT JOIN '
. TABLE_PICTURES . ' c
        ON a.default_picture = c.photo_id
        WHERE
            a.product_id = b.product_id AND
            b.model_id = ?d AND
            a.enabled = 1
        ORDER BY
            a.name
        LIMIT
            ?d, ?d'
,
        $model_id, $page, 8
    );
Для MySQL 5:
Code (php): скопировать код в буфер обмена
    $products = $DB->selectPage(
        $total_products,
        'SELECT
            a.product_id,
            a.name,
            a.price,
            a.quantity,
            c.filename,
            c.thumbnail
        FROM
         (( '
. TABLE_PRODUCTS . ' a,
            '
. TABLE_PRODUCT__MODEL . ' b ))
        LEFT JOIN '
. TABLE_PICTURES . ' c
        ON a.default_picture = c.photo_id
        WHERE
            a.product_id = b.product_id AND
            b.model_id = ?d AND
            a.enabled = 1
        ORDER BY
            a.name
        LIMIT
            ?d, ?d'
,
        $model_id, $page, 8
    );
// отличия в скобочках! (из регеспа выше думал, что все понятно будет...)

И еще:
dev.mysql.com/doc/refman/5.0/en/upgrading-from-4-1.html
dev.mysql.com/doc/refman/5.0/en/join.html
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Jan 22, 2008 5:07 pm (спустя 2 часа 30 минут; написано за 49 секунд)
   Post subject:
Reply with quote

RADiActive
Ну, подобные regexp'ы точно не надо делать, т.к. Вы же сами пишете запросы для базы данных, и Вы знаете, с какой версией MySQL имеете дело :). Но за информацию спасибо.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Wed Jan 23, 2008 8:50 am (спустя 15 часов 42 минуты; написано за 3 минуты 32 секунды)
   Post subject:
Reply with quote

Юрий Насретдинов
Жалко, что несовместимость получается :( Хотелось на уровне библиотеки устранить ее. Хотя, наверное, это излишне...

С др. форума:
Quote:
А хитрость состоит в том, что если таблица, с которой потом идет связка стоит последняя в списке, скобки можно не ставить, а если нет, тогда нужно взять в скобки, причем я не проверял только ли ее, а взял в скобки все...
Там приводят пример и берут в одинарные скобки. Как правильно - я не знаю.

P.S. Удалите мое сообщение от Гость, т.к. оно дублируется и не несет никакой смысловой нагрузки.
Back to top
RADiActive
Заглянувший



Joined: 23 Mar 2007
Posts: 9
Карма: -1
   поощрить/наказать


PostPosted: Wed Jan 23, 2008 8:52 am (спустя 2 минуты; написано за 33 секунды)
   Post subject:
Reply with quote

:( Что ты будешь делать! Опять был я под гостем - разлогиниваюсь.
Back to top
View user's profile Send private message
tf8
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jan 24, 2008 9:11 pm (спустя 1 день 12 часов 19 минут; написано за 3 минуты 5 секунд)
   Post subject: ошибка в документации
Reply with quote

Здравствуйте, Дмитрий

Видимо после перехода на вторую версию DbSimple вы забыли кое-что изменить в документации
dklab.ru/lib/DbSimple/manual.html#list38
Code (php): скопировать код в буфер обмена
$DB->setLogger('myLogger');
function myLogger($db, $sql)
{
  //
  $caller = $db->findLibraryCaller();
  $tip = "at ".@$caller['file'].' line '.@$caller['line'];
  //
  echo (www.php.net/echo) "<xmp title=\"$tip\">";
  print_r (www.php.net/print_r)($sql);
  echo (www.php.net/echo) "</xmp>";
}
Необходимость в вызове $db->findLibraryCaller(); отпала, мало того, этот вызов приводит к тому, что местом вызова, о котором сообщает логгер оказывается место, в котором определен сам логгер.
Вот как должен выглядеть новый пример:
Code (php): скопировать код в буфер обмена
$DB->setLogger('myLogger');
function myLogger($db, $sql, $caller)
{
  $tip = "at ".@$caller['file'].' line '.@$caller['line'];
  // Печатаем запрос (конечно, Debug_HackerConsole лучше).
  echo (www.php.net/echo) "<xmp title=\"$tip\">";
  print_r (www.php.net/print_r)($sql);
  echo (www.php.net/echo) "</xmp>";
}
С уважением, Максим
Back to top
GiBSON
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Jan 30, 2008 11:28 am (спустя 5 дней 14 часов 17 минут; написано за 45 секунд)
   Post subject: Fatal error: Call to a member function select() on a non-object in * on line 896
Reply with quote

Вообще у меня такой вопрос вот есть запрос вида
Code (SQL): скопировать код в буфер обмена
$result=$DB->select("SELECT * FROM web_menu WHERE menu=? AND language=? AND mainmenu=0 ORDER BY id", $i, $_COOKIE['SITE_LANG']);
а вот что мне на него выдает

Fatal error: Call to a member function select() on a non-object in C:\soft\xampp\htdocs\inc\conf\conf.functions.php on line 896

подскажите в чем моя ошибка
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Jan 30, 2008 9:14 pm (спустя 9 часов 45 минут; написано за 43 секунды)
   Post subject:
Reply with quote

GiBSON
прблема перевести с английского? $DB у Вас - не объект
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Mon Feb 04, 2008 12:09 pm (спустя 4 дня 14 часов 55 минут; написано за 8 минут 48 секунд)
   Post subject:
Reply with quote

Что если сделать версию DbSimple для php5, где можно было бы включать режим "бросаться эксепшенами" в случае ошибки запроса?
Например:
Code (php): скопировать код в буфер обмена
$DB = DbSimple_Generic::connect(CFG_DSN);
$DB->enable_exceptions();
В некоторых ситуациях так и задумано, чтобы запрос мог возвращать ошибку. В таком случае можно добавить метод disable_exceptions(), а также добавить в оба метода параметры с возможностью комбинирования.
Code (php): скопировать код в буфер обмена
$DB->enable_exceptions(); //
$DB->enable_exceptions(2); //
$DB->disable_exceptions(); //
$DB->disable_exceptions(1); //
 
Впрочем, ничего не мешает программисту поставить лишний try-catch в таком случае.

В сам объект-эксепшн можно поместить всю полезную информацию, которая сейчас хранится в атрибуте $DB->error (при этом сам атрибут, естественно, не трогать для обратной совместимости).

з.ы. могу попробовать написать
Back to top
View user's profile Send private message Send e-mail
l_nagash
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 22, 2008 4:06 pm (спустя 18 дней 3 часа 56 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Добрый день.

Не подскажите, есть ли возможность в DBSimple узнать номер послднего ИД вставленного в таблицу?
у mysql есть last_insert_id() а в postgre я не нашел подобного.

Есть ли хорощий способ, чтоб збежать дополнительно запроса select MAX(id) ... ?
Back to top
Тим
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 22, 2008 4:44 pm (спустя 37 минут; написано за 5 минут 12 секунд)
   Post subject: Некорректная работа библиотеки при переопределении set_error_handler()
Reply with quote

Здравствуйте, Дмитрий.
В проекте возникла необходимость перейти на свой обработчик ошибок set_error_handler().
Code (php): скопировать код в буфер обмена
function error_handler( $errno, $errstr, $errfile, $errline )
{
        if( error_reporting (www.php.net/error_reporting)() ) {
                echo (www.php.net/echo) '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
                        <html>
                        <head>
                        <meta http-equiv="content-type" content="text/html; charset=windows-1251" />
                        </head>
                        <body>
                        Извините, сервер не работает.
                        </body>
                        </html>'
;
                        $f = fopen (www.php.net/fopen)( PATH_KERNEL . '/kernel.log', 'a+' );
                        fwrite (www.php.net/fwrite)( $f, '[' . date (www.php.net/date)( "d/m/Y H:i" ) . '] ' . $errno . ' / ' . $errstr . '/' . $errfile . '/' . $errline . "\n" );
                        fclose (www.php.net/fclose)( $f );
        }
}
set_error_handler (www.php.net/set_error_handler)( 'error_handler' );
Библиотека DbSimple подключается после вышеприведённого кода.
После перехода на свой обработчик, DbSimple показывает ошибку:
Non-static method DbSimple_Generic::connect() should not be called statically
и указывает на строку $Db = DbSimple_Generic::connect ....
что бы это могло быть?
Спасибо.
Back to top
l_nagash
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sat Feb 23, 2008 1:44 am (спустя 8 часов 59 минут; написано за 2 минуты 31 секунду)
   Post subject:
Reply with quote

На счет последнего вставленного ид можно так сделать:
        $insertedId = DB->query("SELECT lastval()");
        echo $insertedId[0]['lastval']; - дает то что нужно.

Только меня беспокоит вопрос производительности в этом случаем.

Может лучше использовать DB->query("SELECT MAX(id) FROM ...") ?
Back to top
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 185
   поощрить/наказать

Location: Москва

PostPosted: Sun Feb 24, 2008 10:38 am (спустя 1 день 8 часов 53 минуты; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

l_nagash

Это не годится, лучше сделать проще и надежнее (пример):
Code (php): скопировать код в буфер обмена
    /**
     * Returns the ID generated by a query on a table with a column having the AUTO_INCREMENT attribute.
     * If the last query wasn't an INSERT or UPDATE statement or
     * if the modified table does not have a column with the AUTO_INCREMENT attribute,
     * this function will return zero.
     *
     * @return  int
     */

    public function insertId()
    {
        return @$this->mysqli->insert_id;
    }
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Sun Feb 24, 2008 1:43 pm (спустя 3 часа 5 минут; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

l_nagash
Если запрос был insert, то mysql возвращает значение вставленного автоинкремента, если такой был предусмотрен. И метод query() его возвращает.
Code (php): скопировать код в буфер обмена
$new_id = $db->query('INSERT ...');
select MAX(id) нельзя делать ни в коем случае.
Back to top
View user's profile Send private message Send e-mail
l_nagash
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 26, 2008 3:22 am (спустя 1 день 13 часов 39 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Rin
Я писал:
Quote:
"у mysql есть last_insert_id() а в postgre я не нашел подобного."
т.е. мне нужно именно в Postresql узнать номер последнего вставленного ид.
В mysql с этим проблем нет...

тот вариант что я прдложил рботает, но я неуверен в его эффективности.
Back to top
Ivan1986
Участник форума
Warnings: 2


Joined: 09 Oct 2007
Posts: 807
Карма: 38
   поощрить/наказать


PostPosted: Mon Mar 03, 2008 11:13 am (спустя 6 дней 7 часов 50 минут; написано за 7 минут)
   Post subject:
Reply with quote

Здраствуйте
библиотека замечательная, но у нее есть небольшой недостаток по скорости работы :(
У меня версия (брал из svn, есть ли новее?)
* @version 2.x $Id: Generic.php 172 2007-03-10 13:37:51Z dk $

Если подключать сразу файлик определенного драйвера базы и закомментировать
Code (php): скопировать код в буфер обмена
95:        /*if (!class_exists($class)) {
.....
112:       }*/
а также
Code (php): скопировать код в буфер обмена
117:       /*$object->setCachePrefix(md5(serialize($parsed['dsn'])));
.....
139:       }*/
то в профайлере время у этого файла уменьшается на порядок

Мое мнение, что не нужно пытаться подключить кешер, а нужно использовать тот, который есть в проекте.
Также есть мнение, что функцию _calcFoundRowsAvailable (Mysql.php 185 строчка) уже имеет смысл убрать - mysql уже везде по крайне мере 4, если не 5
Back to top
View user's profile Send private message Send e-mail
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Tue Mar 04, 2008 4:29 pm (спустя 1 день 5 часов 15 минут; написано за 3 минуты 37 секунд)
   Post subject:
Reply with quote

Возникла пара вопросов по коду (прошу прощения, если повтор):
Code (php): скопировать код в буфер обмена
//
if (!@$DB->query('UPDATE tbl SET field=? WHERE id=1', $field)) {
  //
  //
  $DB->query('INSERT INTO tbl(id, field) VALUES(1, ?)', $field)
}
1. Как в первой строчке может возникнуть ошибка, если запрос корректен? У меня на попытку обновить несуществующую запись возвращается 0, без ошибки.

2. Если UPDATE фактически не меняет запись, то есть если значение $field идентично тому, которое уже содердится в данной записи, то обновление строки не производится и возвращается нуль. Соответственно, после этого выполняетсмя совершенно ненужный INSERT. Как с этим бороться?

p.s. Версия MySQL: 4.1
Back to top
View user's profile Send private message
Ivan1986
Участник форума
Warnings: 2


Joined: 09 Oct 2007
Posts: 807
Карма: 38
   поощрить/наказать


PostPosted: Tue Mar 04, 2008 5:42 pm (спустя 1 час 13 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Юрик
там код наобород нужен
if (!@ insert) {
    update
}
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Mar 12, 2008 1:25 am (спустя 7 дней 7 часов 43 минуты; написано за 44 секунды)
   Post subject:
Reply with quote

Юрик
а в 4.1 ещ не было конструкции
Code (SQL): скопировать код в буфер обмена
ON DUPLICATE KEY UPDATE
?
Back to top
View user's profile Send private message
Yurij
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Mar 19, 2008 3:04 pm (спустя 7 дней 13 часов 38 минут; написано за 3 минуты 34 секунды)
   Post subject: Получение ID при insert в БД PostgreSQL
Reply with quote

При выполнении кода
Code (php): скопировать код в буфер обмена
$userId = $DB->query('INSERT INTO users SET ?a', $userData);
Запрос выполняется успешно, но в переменной $userId ничего нету.

Вопрос: "как получить id с которым была добавлена строка?"

используется PostgreSQL, на нужный id sequence создан, и работает.

Заранее благодарен.
Back to top
Demonil
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Mar 21, 2008 11:19 am (спустя 1 день 20 часов 14 минут; написано за 6 минут 43 секунды)
   Post subject:
Reply with quote

Доброго времени суток.
Вопрос скорее общего плана. dsn парсится в parseDSN($dsn) в Generic.php обычным parse_url который разумеется валится в случае если пароль включает в себя '@',
то есть примерно следующее я получаю при отправке такого dsn 'mysql://dimadima:P@ssw0rd@localhost/dimadima'(пути, адреса и юзеры изменены:)):
Code (any language): скопировать код в буфер обмена
SQL Error: Unknown MySQL server host 'ssw0rd@localhost' (1) at /home/user/html/main.php line 70

Array
(
    [code] => 2005
    [message] => Unknown MySQL server host 'ssw0rd@localhost' (1)
    [query] => mysql_connect()
    [context] => /home/user/html/main.php line 70
)
разумеется что workaround корявенький починил у меня этот недуг, но я думаю официальный фикс на это должен быть?!
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Sun Mar 23, 2008 11:02 pm (спустя 2 дня 11 часов 43 минуты; написано за 8 минут 55 секунд)
   Post subject:
Reply with quote

Юрик
Quote:
1. Как в первой строчке может возникнуть ошибка, если запрос корректен?
В приведенном Вами коде в условии if (!@$DB->query... проверяется, возвращает ли пустое значение вызовом этого метода, ни более того. В данном случае UPDATE возвращает количество измененных строк. Ноль измененных строк не означает наличие ошибки.
Quote:
  // Здесь идет реакция на ошибку, если она возникла.
  // Контекст ошибки можно получить через $DB->error.
Проверяйте, была ли ошибка запроса, с помощью такой конструкции:
Code (php): скопировать код в буфер обмена
//
if (null !== $DB->error)
{
    //
}
Quote:
2. Если UPDATE фактически не меняет запись, то есть если значение $field идентично тому, которое уже содердится в данной записи
Не вижу никакой логической связи (там еще условие WHERE).
Ок, допустим.
Quote:
то обновление строки не производится и возвращается нуль
Возвращается ноль. И то, это не документированная возможность DbSimple, а документированная возможность MySQL.
Quote:
Соответственно, после этого выполняетсмя совершенно ненужный INSERT. Как с этим бороться?
Сделайте так, чтобы целостностью данных занималась БД, т.е. не дала бы вставить "лишнюю" запись. Для этого обычно используют индексы уникальности, внешние ключи.
Еще обязательно гляньте в сторону REPLACE INTO: dev.mysql.com/doc/refman/5.0/en/replace.html (только не злоупотребляйте ;)
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Sun Mar 23, 2008 11:17 pm (спустя 15 минут; написано за 9 минут 37 секунд)
   Post subject:
Reply with quote

Yurij
Quote:
"как получить id с которым была добавлена строка?" (PostgreSQL)
Если метод query() не возвращает требуемого значения, Вам не повезло: придется читать документацию к БД и выяснять, как это делается.
Например, в БД Firebird для получения уникального автоинкремента, я использую генераторы. Т.е. сначала селектим из генератора:
Code (SQL): скопировать код в буфер обмена
SELECT FIRST 1 GEN_ID(GEN_AIT_USER, 1) FROM RDB$DATABASE
Полученное значение вставляем вместе с остальными полями. Что примечательно, генератор работает независимо от транзакций, поэтому гарантированно возвращает уникальное значение.

Полагаю, что "sequence" в PostgreSQL, по смыслу - тот же, что и генератор в Фаерберде.
Полезным в администрировании может оказаться IBExpert - последняя версия вроде поддерживает PostgreSQL.

з.ы. RDB$DATABASE - база с метаданными Фаерберда. Как говорил старина Кодд, каждая реляционная СУБД должна содержать свои метаданные в виде реляционных же данных.
Back to top
View user's profile Send private message Send e-mail
mlitkin
Заглянувший



Joined: 28 Mar 2008
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 28, 2008 9:31 am (спустя 4 дня 10 часов 14 минут; написано за 24 секунды)
   Post subject:
Reply with quote

Не подскажите как в DbSimple вызывать ХП и получать от них результат выборки? Вот такой скрипт ругается:
Code (php): скопировать код в буфер обмена
require_once "lib/DbSimple/config.php";
require_once "lib/DbSimple/Generic.php";
$db = DbSimple_Generic::connect("mysql://root:a@localhost/im_net");
$rows = $db->select("call SYS_GET_SYNC_TABLE_COLUMNS(1)");
foreach ($rows as $numRow => $row)
    echo (www.php.net/echo) $row['NAME'];
Выпадает вот такая ошибка:
SQL Error: PROCEDURE im_net.SYS_GET_SYNC_TABLE_COLUMNS can't return a result set in the given context at C:\Apache\localhost\www\InetMarket.NET\test.php line 19
Array
(
    [code] => 1312
    [message] => PROCEDURE im_net.SYS_GET_SYNC_TABLE_COLUMNS can't return a result set in the given context
    [query] => call SYS_GET_SYNC_TABLE_COLUMNS(1)
    [context] => C:\Apache\localhost\www\InetMarket.NET\test.php line 19
)
Back to top
View user's profile Send private message
mlitkin
Заглянувший



Joined: 28 Mar 2008
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 28, 2008 9:32 am (спустя 1 минуту 32 секунды; написано за 21 секунду)
   Post subject:
Reply with quote

Другими средствами все прекрасно работает
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Fri Mar 28, 2008 3:23 pm (спустя 5 часов 50 минут; написано за 34 секунды)
   Post subject:
Reply with quote

Code (SQL): скопировать код в буфер обмена
SELECT FROM SYS_GET_SYNC_TABLE_COLUMNS(1)
DbSimple тут причем?
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3 ... 6, 7, 8 ... 13, 14, 15  Next
Page 7 of 15    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML